type reponse = 
  | Accepte
  | Refuse
  | Interrompu

exception Requete_en_cours

class virtual t :
object
  method virtual envoyer: Protocole.msg -> unit
  method receptionner: Protocole.msg -> unit
  method est_connecte: bool
  method mon_nom: string
  method joueurs_disponibles: string list
  method mes_adversaires: string array
  method en_jeu: bool
  method mon_numero: int option
  method enchere_de: int -> int option
  method preneur: int option
  method carte_appelee: Carte.carte option
  method ecart_connu: Carte.carte list option
  method mon_jeu: Carte.carte list
  method chien: Carte.carte list
  method repartition_cartes: (int * Carte.carte * int) list
  method joueur_maitre: int option
  method pli_termine: bool
  method nombre_plis_joues: int
  method couleur_ouverture: Carte.couleur option
  method joueur_ouverture: int
  method requete_en_cours: bool
  method doit_priser: bool
  method enchere_maximale: int * int (* preneur * enchère *)
  method doit_appeler: bool
  method cartes_appelables: Carte.carte list
  method peut_appeler: Carte.carte -> bool
  method doit_ecarter: bool
  method carte_ecartable_marginale: Carte.carte list -> Carte.carte list
  (* Si je sélectionne ces cartes, parmi lesquelles puis-je choisir *)
  (* la suivante ? NB : si vide, soit on a sélectionné des cartes interdites, *)
  (* soit on serait obligé de ne pas sélectionner des cartes obligatoires, *)
  (* soi c'est bon.*)
  method peut_ecarter: Carte.carte list -> bool
  method doit_jouer: bool
  method cartes_jouables: Carte.carte list
  method peut_jouer: Carte.carte -> bool
  method deconnecter: unit
  method identifier: string -> (reponse -> unit) -> unit
  method inviter: string list -> (reponse -> unit) -> unit
  method priser: int -> (reponse -> unit) -> unit
  method appeler: Carte.carte -> (reponse -> unit) -> unit
  method ecarter: Carte.carte array -> (reponse -> unit) -> unit
  method jouer: Carte.carte -> (reponse -> unit) -> unit
end
